import cv2 as cv

# 1. 在测试视频(OpenCV安装目录\sources\samples\data)上，
#  使用基于混合高斯模型的背景提取算法，提取前景并显示(显示二值化图像，前景为白色)。
# 2. 在1基础上，将前景目标进行分割，进一步使用不同颜色矩形框标记，并在命令行窗口中输出每个矩形框的位置和大小。
cap = cv.VideoCapture(r'D:\opencv\sources\samples\data\vtest.avi')
if not cap.isOpened():
    print("无法打开视频文件")
element = cv.getStructuringElement(cv.MORPH_ELLIPSE,(3,3))
fgbg=cv.createBackgroundSubtractorMOG2()
count = 0
thresh = 200

while(True):
    ret, frame = cap.read()
    if not ret:
        break
    fgmask = fgbg.apply(frame)
    # 开运算，去噪点
    fgmask = cv.morphologyEx(fgmask, cv.MORPH_OPEN, element)
    # 在二值图像上检测物体轮廓
    rect, contours, hierarchy = cv.findContours(fgmask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for c in contours:
        # 面积
        area = cv.contourArea(c)
        # 区域面积小于阈值
        if area < thresh:
            continue
        count += 1
        # 打印出每个前景的面积
        print("{}-prospect:{}".format(count, area), end="  ")
        x, y, w, h = cv.boundingRect(c)
        # 打印坐标
        print("x:{} y:{}".format(x, y))
        # 在原图上画外接矩形
        cv.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        # 在前景框上标上编号
        cv.putText(frame, str(count), (x, y), cv.FONT_HERSHEY_COMPLEX, 0.4, (0, 225, 0), 1)
        # 显示总数
    cv.putText(frame, "count:", (5, 20), cv.FONT_HERSHEY_COMPLEX, 0.6, (0, 255, 0), 1)
    cv.putText(frame, str(count), (75, 20), cv.FONT_HERSHEY_COMPLEX, 0.6, (0, 255, 0), 1)
    print("----------------------------")

    cv.resizeWindow("frame", 700, 500)
    cv.resizeWindow("fgmask", 700, 500)
    # 显示每一帧图像
    cv.imshow('frame', frame)
    # 显示每一帧图像对应的前景提取结果
    cv.imshow('fgmask', fgmask)
    # 控制视频播放速度
    k = cv.waitKey(30)
    if k == 27:
        break

cap.release()
cv.destroyAllWindows()